#include "BlockQueue.hpp"

using namespace std;

//单线程
// void *Product(void *avg)
// {
//     BlockQueue<int> *Bq = static_cast<BlockQueue<int> *>(avg);
//     for (int i = 1; i <= 15; i++)
//     {
//         //sleep(1);
//         Bq->Equeue(i);
//         cout << "生产的值:" << i << endl;
//     }
//     return nullptr;
// }
// void *Consume(void *avg)
// {
//     BlockQueue<int> *Bq = static_cast<BlockQueue<int> *>(avg);
//     int t = 0;
//     for (int i = 0; i < 15; i++)
//     {
//        // sleep(2);
//         Bq->Pop(&t);
//         cout << "消费的值: " << t << endl;
//     }
//     return nullptr;
// }

// int main()
// {
//     BlockQueue<int> *Bq = new BlockQueue<int>(1);
//     pthread_t p1, c1;
//     pthread_create(&p1, nullptr, Product, Bq);
//     pthread_create(&c1, nullptr, Consume, Bq);
//     pthread_join(p1, nullptr);
//     pthread_join(c1, nullptr);

//     return 0;
// }


//多线程
#include "BlockQueue.hpp"

using namespace std;

void *Product(void *avg)
{
    BlockQueue<int> *Bq = static_cast<BlockQueue<int> *>(avg);
    for (int i = 1; i <= 15; i++)
    {
        //sleep(1);
        Bq->Equeue(i);
        cout << "生产的值:" << i << endl;
    }
    return nullptr;
}
void *Consume(void *avg)
{
    BlockQueue<int> *Bq = static_cast<BlockQueue<int> *>(avg);
    int t = 0;
    for (int i = 0; i < 15; i++)
    {
       // sleep(2);
        Bq->Pop(&t);
        cout << "消费的值: " << t << endl;
    }
    return nullptr;
}

int main()
{
    BlockQueue<int> *Bq = new BlockQueue<int>(5);
    vector<pthread_t> q,c;
    for(int i=0;i<5;i++)
    {
        pthread_t tid;
        q.push_back(tid);
        pthread_create(&tid,nullptr, Product, Bq);
    }
    for(int i=0;i<5;i++)
    {
        pthread_t tid;
        c.push_back(tid);
        pthread_create(&tid, nullptr, Consume, Bq);
    }
    for(auto x:q)
    {
        pthread_join(x, nullptr);
    }
    cout<<"生产者全部回收完毕"<<endl;
    for(auto x:c)
    {
        pthread_join(x, nullptr);
    }
    cout<<"消费者全部回收完毕"<<endl;
    return 0;
}
// #pragma once
// #include <iostream>
// #include <string>
// #include <functional>

// // 生产者可以生产(构造)一个任务Task对象，然后让消费者进行执行
// // 任务类型1
// class Task
// {
// public:
//     Task() {}
//     Task(int a, int b) : _a(a), _b(b), _result(0)
//     {
//     }
//     void Excute()
//     {
//         _result = _a + _b;
//     }
//     std::string ResultToString()
//     {
//         return std::to_string(_a) + "+" + std::to_string(_b) + "=" +
//                std::to_string(_result);
//     }
//     std::string DebugToString()
//     {
//         return std::to_string(_a) + "+" + std::to_string(_b) + "=?";
//     }

// private:
//     int _a;
//     int _b;
//     int _result;
// };
// // 同样的，生产者也可以生产将要执行的函数，让消费者进行执行
// //  实际上这也就是我们后面要实现的线程池的原理
// // 任务类型2
// using Task = std::function<void()>;